import grails.test.*

class SeguimientoClienteTests extends GrailsUnitTestCase {

    Date fechaTest
    Cliente clienteTest
    Vendedor vendedorTest

    protected void setUp() {
        super.setUp()
        mockDomain(SeguimientoVenta)
        mockDomain(TipoCliente)
        mockDomain(EstadoCliente)
        mockDomain(Cliente)
        mockDomain(Vendedor)
        SeguimientoVenta.list()*.delete()
        fechaTest = new Date()
        clienteTest = new ClienteTests().createClienteOK()
        vendedorTest = new VendedorTests().createVendedorOK()
    }

    protected void tearDown() {
        super.tearDown()
    }

    SeguimientoVenta createSeguimientoCliente(){
        SeguimientoVenta sc = new SeguimientoVenta(
            vendedor:vendedorTest,
            cliente:clienteTest,
            nroVisita:2,
            descripcionVisita:'Entrega de cotizacion',
            fecha:fechaTest)
        sc
    }

    void testSeguimientoClienteOK(){
        SeguimientoVenta sc = createSeguimientoCliente()
        assert sc.vendedor==vendedorTest
        assert sc.cliente==clienteTest
        assert sc.nroVisita==2
        assert sc.descripcionVisita=='Entrega de cotizacion'
        assert sc.fecha==fechaTest
    }

    void testPersist(){
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.save()
        assertEquals('No guardo objeto valido', SeguimientoVenta.count(), 1)
        SeguimientoVenta sc2 = createSeguimientoCliente()
        sc2.cliente = null
        sc2.save()
        assertEquals('Guardo objeto no valido', SeguimientoVenta.count(), 1)
        SeguimientoVenta sc3 = createSeguimientoCliente()
        sc3.cliente.nombreEstablecimiento = '' //dato invalido
        sc3.save()
        assertEquals('Guardo objeto que hace referencia a otro no valido', SeguimientoVenta.count(), 1)
    }

    void testVendedor(){
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.vendedor = null
        assertFalse 'El vendedor no debe ser nulo', sc.validate()
    }

    void testCliente() {
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.cliente = null
        assertFalse 'El cliente no debe ser nulo', sc.validate()
    }

    void testNroVisita(){
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.nroVisita = null
        assertFalse 'campo obligatorio', sc.validate()
        sc.nroVisita = -1
        assertFalse 'campo no debe ser negativo', sc.validate()
        sc.nroVisita = 0
        assertFalse 'campo debe ser mayor que cero', sc.validate()
        sc.nroVisita = 2
        assertTrue 'campo correcto', sc.validate()
    }

    void testCompositeKey(){
        SeguimientoVenta sc = createSeguimientoCliente()
        Cliente c = new ClienteTests().createClienteOK()
        Integer n = 5
        sc.cliente = c
        sc.nroVisita = n
        assertTrue 'objeto deberia ser valido', sc.validate()
        sc.save()
        SeguimientoVenta sc2 = createSeguimientoCliente()
        sc2.cliente = c
        sc2.nroVisita = n
        assertFalse 'llave primaria repetida', sc2.validate()
        sc2.nroVisita = 3
        assertTrue 'llave primaria no repetida, objeto debe ser valido', sc2.validate()
        sc2.nroVisita = n
        sc2.cliente = new ClienteTests().createClienteOK()
        assertTrue 'llave primaria no repetida, objeto debe ser valido', sc2.validate()
    }

    void testDescripcionVisita(){
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.descripcionVisita = ''
        assertFalse 'campo obligatorio', sc.validate()
    }

    void testFecha(){
        SeguimientoVenta sc = createSeguimientoCliente()
        sc.fecha = null
        assertFalse 'campo obligatorio', sc.validate()        
    }

    void testToString(){
        SeguimientoVenta sc = createSeguimientoCliente()
        assertEquals(sc.toString(), 'Exito - 2') 
    }
}
